{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 牢记 Reactor 的四大构件与职责划分。\n",
    "2. 搞清楚 “注册→监听→分发→处理” 的完整链条。\n",
    "3. 熟悉 muduo 的主从 Reactor 设计与线程模型。\n",
    "4. 处理流程遵循「读、解码、计算、编码/发送」四步，善用线程池托管耗时任务。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reactor 模型概览"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**核心理念**：用事件驱动模式处理大量并发请求。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "四大核心组件与协作职责\n",
    "\n",
    "| 组件              | 作用                                                     | 典型实现                  |\n",
    "| ----------------- | -------------------------------------------------------- | ------------------------- |\n",
    "| **Event**         | 描述具体 fd 上的就绪事件（读、写等），可附带超时等元数据 | epoll 的 `epoll_event`    |\n",
    "| **Reactor**       | 事件循环的中枢：负责事件注册、启动循环、分发回调         | `EventLoop`／`Reactor` 类 |\n",
    "| **Demultiplexer** | 多路事件解复用器，只负责监听就绪事件，不存储处理器       | `epoll_wait`／`kqueue`    |\n",
    "| **EventHandler**  | 针对事件的回调对象，完成「读→解码→计算→编码→发送」       | 业务处理器、连接对象等    |\n",
    "\n",
    "> 实战中常把 Reactor 与 Demultiplexer 整合为一个类（如 muduo 的 EventLoop），但概念上仍以“协调”和“监听”分工更易理解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "事件注册与管理\n",
    "\n",
    "1. 应用把感兴趣的 `fd` 事件及对应回调注册到 Reactor（常用 `std::map`/哈希表维护 fd → handler 映射）。\n",
    "2. Reactor 通过 `epoll_ctl`（添加/修改/删除）驱动 Demultiplexer 更新监听集合。\n",
    "3. 注册阶段可扩展额外参数（优先级、超时、上下文数据等），便于后续调度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "事件循环启动与执行\n",
    "\n",
    "1. 调用 `epoll_wait` 进入阻塞等待，新连接或读写事件到来后返回。\n",
    "2. Reactor 收到事件列表后，根据映射查找对应的 EventHandler。\n",
    "3. **必须**由 Reactor 完成分发，再调用 handler 的 `handleEvent`；Demultiplexer 不直接触发回调，以保持职责单一。\n",
    "4. 可采用 “One Loop per Thread”：每个线程维护独享事件循环，减少锁竞争，并让 IO 与业务调度有界。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "EventHandler 的处理链条\n",
    "\n",
    "标准处理步骤通常拆成四段，便于清晰的责任划分与复用：\n",
    "\n",
    "1. **Read**：从 socket/文件中读取原始字节流。\n",
    "2. **Decode**：解析协议、反序列化请求。\n",
    "3. **Compute**：执行业务逻辑，可能耗时。\n",
    "4. **Encode & Send**：序列化响应并写回客户端。\n",
    "\n",
    "> Compute 阶段若耗时，应交给线程池或任务队列，避免阻塞事件循环线程。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "muduo 的多 Reactor 模式\n",
    "\n",
    "- **Main Reactor**（主反应堆）：监听监听 socket，负责 `accept` 新连接。\n",
    "- **Sub Reactor**（从反应堆）：每个连接绑定到某个 sub Reactor，专职处理读写事件。\n",
    "- 每个 Reactor 含有完整的 EventLoop（Reactor + Demultiplexer），并运行在独立线程，实现 “multiple reactors” 拓扑。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ET 模式下的关键实践\n",
    "\n",
    "- 使用边缘触发（ET）时，socket 必须设置为非阻塞，并在一次事件中「读/写到 `EAGAIN`」为止，避免遗漏后续数据。\n",
    "- 若 handler 中执行阻塞调用，会阻塞整个事件循环，导致 `epoll_wait` 无法及时返回，出现吞吐瓶颈。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
